package junit;

import java.util.ArrayList;
import java.util.Arrays;

import junit.framework.TestCase;

public class JUnitDemo extends TestCase {
	private CountedList<String> list = new CountedList<String>();
	
	public JUnitDemo(String name) {
		super(name);
		for(int i = 0; i < 3; i++)
			list.add("" + i);
	}

	// Thus, setUp() is optional, but is run right
	// before the test:
	protected void setUp() {
		System.out.println("Set up for " + list.getId());
	}

	// tearDown() is also optional, and is called after
	// each test. setUp() and tearDown() can be either
	// protected or public:
	public void tearDown() {
		System.out.println("Tearing down " + list.getId());
	}

	// All tests have method names beginning with "test":
	public void testInsert() {
		System.out.println("Running testInsert()");
		assertEquals(list.size(), 3);
		list.add(1, "Insert");
		assertEquals(list.size(), 4);
		assertEquals(list.get(1), "Insert");
	}

	public void testReplace() {
		System.out.println("Running testReplace()");
		assertEquals(list.size(), 3);
		list.set(1, "Replace");
		assertEquals(list.size(), 3);
		assertEquals(list.get(1), "Replace");
	}

	// A "helper" method to reduce code duplication. As long
	// as the name doesn't start with "test," it will not
	// be automatically executed by JUnit.
	private void compare(ArrayList<String> lst, String[] strs) {
		String[] array = lst.toArray(new String[0]);
		assertTrue("Arrays not the same length", array.length == strs.length);
		for (int i = 0; i < array.length; i++)
			assertEquals(strs[i], array[i]);
	}

	public void testOrder() {
		System.out.println("Running testOrder()");
		compare(list, new String[] { "0", "1", "2" });
	}

	public void testRemove() {
		System.out.println("Running testRemove()");
		assertEquals(list.size(), 3);
		list.remove(1);
		assertEquals(list.size(), 2);
		compare(list, new String[] { "0", "2" });
	}

	public void testAddAll() {
		System.out.println("Running testAddAll()");
		list.addAll(Arrays.asList(new String[] { "An", "African", "Swallow" }));
		assertEquals(list.size(), 6);
		compare(list,
				new String[] { "0", "1", "2", "An", "African", "Swallow" });
	}

	public static void main(String[] args) {
		// Invoke JUnit on the class:
		junit.textui.TestRunner.run(JUnitDemo.class);
		// junit.swingui.TestRunner.run(JUnitDemo.class);
		boolean b = false;
		System.out.println(b = true);
	}
}

class CountedList<T> extends ArrayList<T> {
	private static final long serialVersionUID = 7360132695245175571L;
	private static int counter = 0;
	private int id = counter++;

	public CountedList() {
		System.out.println("CountedList #" + id);
	}

	public int getId() {
		return id;
	}
}